import { mat4 } from "gl-matrix"
/**
 * 变换矩阵状态维护类
 */
function MatrixState(){
    this.mProjMatrix    = new Array(16);   // 投影矩阵
    this.mVMatrix       = new Array(16);   // 摄像机矩阵
    this.currMatrix     = new Array(16);   // 基本变换矩阵
    this.mStack         = new Array(100);  // 存放矩阵元素的栈
    this.initCurrMatrix();
}

MatrixState.prototype = {
    constructor : MatrixState,
    /**
     * 初始化基本变换矩阵为单位矩阵
     */
    initCurrMatrix : function(){
        mat4.identity(this.currMatrix);
    },
    /**
     * 保护变换矩阵，将当前变换矩阵入栈
     */
    pushMatrix : function(){
        this.mStack.push(this.currMatrix.slice(0));
    },
    /**
     * 恢复变换矩阵，当前矩阵出栈
     */
    popMatrix : function(){
        this.currMatrix = this.mStack.pop();
    },
    /**
     * 执行平移变换 
     * 
     * @param { number } x 沿x轴平移距离
     * @param { number } y 沿y轴平移距离
     * @param { number } z 沿z轴平移距离
     */
    translate : function(x, y, z){
        mat4.translate(this.currMatrix, this.currMatrix, [x,y,z]);
    },
    /**
     * 执行旋转变换
     * 
     * @param { number } x 沿x轴旋转角度
     * @param { number } y 沿y轴旋转角度
     * @param { number } z 沿z轴旋转角度
     */
    rotate : function(x, y, z){
        var degX = x * Math.PI/180,
            degY = y * Math.PI/180,
            degZ = z * Math.PI/180;
        mat4.rotate(this.currMatrix, this.currMatrix, degX, [1,0,0]);
        mat4.rotate(this.currMatrix, this.currMatrix, degY, [0,1,0]);
        mat4.rotate(this.currMatrix, this.currMatrix, degZ, [0,0,1]);
    },
    /**
     * 执行缩放变换
     * 
     * @param { number } x 沿x轴缩放倍数
     * @param { number } y 沿y轴缩放倍数
     * @param { number } z 沿z轴缩放倍数
     */
    scale :function(x, y, z){
        mat4.scale(this.currMatrix, this.currMatrix, [x,y,z]);
    },
    /**
     * 设置摄像机
     * 
     * @param { vec3 } eye 摄像机位置
     * @param { vec3 } center 观察点位置
     * @param { vec3 } up 摄像机up向量
     */
    setCamera : function(camera){
        mat4.lookAt(this.mVMatrix, camera.eye, camera.center, camera.up);
    },
    /**
     * 设置透视投影参数
     */
    setProjectFrustum: function(project){
        mat4.frustum(this.mProjMatrix, project.left, project.right, project.bottom, project.top, project.near, project.far);
    },
    /**
     * 设置正交投影参数
     */
    setProjectOrtho : function(project){
        mat4.ortho(this.mProjMatrix, project.left, project.right, project.bottom, project.top, project.near, project.far);
    },
    /**
     * 获取总的变换矩阵
     * 投影矩阵*摄像机矩阵*基本矩阵
     * @returns out 总变换矩阵
     */
    getFinalMatrix : function(){
        var mMVPMatrix = new Array(16);
        mat4.multiply(mMVPMatrix, this.mVMatrix, this.currMatrix);
        mat4.multiply(mMVPMatrix, this.mProjMatrix, mMVPMatrix);
        return mMVPMatrix;
    },
    /**
     * 获取当前变换矩阵
     * 
     * @returns out 当前变换矩阵
     */
    getCurrMatrix : function(){
        return this.currMatrix;
    },
}

export default MatrixState;